// Copyright (C) 2014 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.5
description: >
    class this access restriction
---*/
function Test() {
    class Base {}
    (function() {
      class C extends Base {
        constructor() {
          var y;
          super();
        }
      }; new C();
    }());
    assert.throws(ReferenceError, function() {
      class C extends Base {
        constructor() {
          super(this.x);
        }
      }; new C();
    });
    assert.throws(ReferenceError, function() {
      class C extends Base {
        constructor() {
          super(this);
        }
      }; new C();
    });
    assert.throws(ReferenceError, function() {
      class C extends Base {
        constructor() {
          super.method();
          super(this);
        }
      }; new C();
    });
    assert.throws(ReferenceError, function() {
      class C extends Base {
        constructor() {
          super(super.method());
        }
      }; new C();
    });
    assert.throws(ReferenceError, function() {
      class C extends Base {
        constructor() {
          super(super());
        }
      }; new C();
    });
    assert.throws(ReferenceError, function() {
      class C extends Base {
        constructor() {
          super(1, 2, Object.getPrototypeOf(this));
        }
      }; new C();
    });
    (function() {
      class C extends Base {
        constructor() {
          { super(1, 2); }
        }
      }; new C();
    }());
    (function() {
      class C extends Base {
        constructor() {
          if (1) super();
        }
      }; new C();
    }());

    class C1 extends Object {
      constructor() {
        'use strict';
        super();
      }
    };
    new C1();

    class C2 extends Object {
      constructor() {
        ; 'use strict';;;;;
        super();
      }
    };
    new C2();

    class C3 extends Object {
      constructor() {
        ; 'use strict';;;;;
        // This is a comment.
        super();
      }
    };
    new C3();
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
